
package fr.utt.lo02.projet;
import java.util.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Partie {
    
    private Tapis tapis;
    private ArrayList<Joueur> listJoueurs;
    private Pioche pioche;
    private boolean fin;
    
    public Partie(int nbjoueurs, int nbjeuxdecarte)throws IOException{
        
        pioche=new Pioche(nbjeuxdecarte);
        tapis=new Tapis();
        listJoueurs=new ArrayList<Joueur>();
        
        for (int i=0;i<nbjoueurs;i++){
            ajouterJoueur(i);
        }
        
    }
    
    private void ajouterJoueur(int numero){
        
        String nom=null;
        String prenom=null;
        BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Entrer le nom du joueur:");
        try {
            nom=in.readLine();
        } catch (IOException ex) {
            Logger.getLogger(Partie.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        System.out.println("Entrer le prenom du joueur:");
        try {
            prenom=in.readLine();
        } catch (IOException ex) {
            Logger.getLogger(Partie.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        System.out.println("Le joueur est t-il virtuel ?(y ou n)");
        try {
            if("y".equals(in.readLine())){
                    System.out.println("Choisir une strategie ? 1:Dumbass 2:Normal 3:Experienced");
                    int stratnumber=Integer.parseInt(in.readLine());
                    getListJoueurs().add(new Jvirtual(nom,prenom,stratnumber,numero));
            }else {
                    getListJoueurs().add(new Jphysic(nom,prenom,numero));
            }
        } catch (IOException ex) {
            Logger.getLogger(Partie.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public void demarrer(){
    	
    	fin=false;
    	
    	distribuer();
    	
    	System.out.println("La taille de la pioche est de: "+this.getPioche().getSize()+" cartes, la pioche est:");
        System.out.println(this.pioche.getListCartes());
        System.out.println("La taille de la defausse est de: "+this.getTapis().getSize()+" cartes, la defausse est:");
        System.out.println(this.tapis.getListCartes());
    	
        System.out.println("Les joueurs sont:");
    	afficherJoueurs();
    	
        getBergere();
        int i=0;
    	
    	while(fin==false){
   
                Joueur joueurEnCour=listJoueurs.get(i%listJoueurs.size());
                System.out.println("La derniere carte jouee est: "+tapis.getListCartes().get(tapis.getSize()-1)+"\n");
    		System.out.println("Au tour de "+joueurEnCour.getNom()+" "+joueurEnCour.getPrenom()+"\n");
    		joueurEnCour.jouer(this);
                if(joueurEnCour.getMain().getSize()==0){
    				fin=true;
    		}else{
                      i++;
                }
                
                /*for(Joueur j: getListJoueurs()){
    			System.out.println("La derniere carte jouee est: "+tapis.getListCartes().get(tapis.getSize()-1)+"\n");
    			System.out.println("Au tour de "+j.getNom()+" "+j.getPrenom()+"\n");
    			j.jouer(this);
    			if(j.getMain().getSize()==0){
    				fin=true;
    			}
    		}*/
    	}
        
        for(Joueur j: getListJoueurs()){
            if (j.getMain().getSize()==0){
                System.out.println("Le joueur "+j.getNom()+" "+j.getPrenom()+" à gagné");
            }
        }
    }
    
    public void afficherJoueurs(){
        for(Joueur j: listJoueurs){
            j.afficherInfos();
        }
    }
    
    public int getNbjoueur(){
        return getListJoueurs().size();
    }
    
    public void getBergere(){
    	getTapis().getBergere(pioche);
    }
    
    public void distribuer(){
    	for(int j=0;j<8;j++){
    		for (int i=0;i<listJoueurs.size();i++){
    			getListJoueurs().get(i).ajouterCarte(pioche.piocher());
    		}
    	}   
    }

    public Tapis getTapis() {
        return tapis;
    }

    public ArrayList<Joueur> getListJoueurs() {
        return listJoueurs;
    }
    
    public void changeSens(){
        Collections.reverse(listJoueurs);
    }

    public Pioche getPioche() {
        return pioche;
    }

    public boolean isFin() {
        return fin;
    }

    public void setFin(boolean fin) {
        this.fin = fin;
    }

    public void changerCouleur(Joueur j){
         Random r=new Random();
         int choix=0;
                if (j.isVirtuel()){
                    choix=r.nextInt(5);
                    this.getTapis().ajouterSansVerif(new Carte(15,choix));
                }else{
                    System.out.println(this+": Choisir la couleur de votre choix \n 0: Pic\n1: Coeur\n2: Carreaux\n3:Trefle");
                    BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            try {
                choix=Integer.parseInt(in.readLine());
            } catch (IOException ex) {
                Logger.getLogger(Partie.class.getName()).log(Level.SEVERE, null, ex);
            }
                    this.getTapis().ajouterSansVerif(new Carte(15,choix));
                }
    }
    
    
}
